package com.ruoyi.zhongchuangauto.service.impl;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.EasyExcel;
import com.ruoyi.common.annotation.DataSource;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.enums.DataSourceType;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.zhongchuangauto.mapper.ProductMapper;
import com.ruoyi.zhongchuangauto.domain.Product;
import com.ruoyi.zhongchuangauto.service.IProductService;
import org.springframework.transaction.annotation.Transactional;

/**
 * 商品信息Service业务层处理
 *
 * @author ruoyi
 * @date 2025-09-10
 */
@Slf4j
@Service
@DataSource(DataSourceType.ZHONGCHUANGAUTO)
public class ProductServiceImpl implements IProductService
{
    @Autowired
    private ProductMapper productMapper;
    @Autowired
    private RuoYiConfig ruoyiConfig;   // 直接注入

    /**
     * 查询商品信息
     *
     * @param productId 商品信息主键
     * @return 商品信息
     */
    @Override
    public Product selectProductByProductId(Long productId)
    {
        return productMapper.selectProductByProductId(productId);
    }

    /**
     * 查询商品信息列表
     *
     * @param product 商品信息
     * @return 商品信息
     */
    @Override
    public List<Product> selectProductList(Product product)
    {
        return productMapper.selectProductList(product);
    }

    /**
     * 新增商品信息
     *
     * @param product 商品信息
     * @return 结果
     */
    @Override
    public int insertProduct(Product product)
    {
        return productMapper.insertProduct(product);
    }

    /**
     * 修改商品信息
     *
     * @param product 商品信息
     * @return 结果
     */
    @Override
    public int updateProduct(Product product)
    {
        return productMapper.updateProduct(product);
    }

    /**
     * 批量删除商品信息
     *
     * @param productIds 需要删除的商品信息主键
     * @return 结果
     */
    @Override
    public int deleteProductByProductIds(Long[] productIds)
    {
        return productMapper.deleteProductByProductIds(productIds);
    }

    /**
     * 删除商品信息信息
     *
     * @param productId 商品信息主键
     * @return 结果
     */
    @Override
    public int deleteProductByProductId(Long productId)
    {
        return productMapper.deleteProductByProductId(productId);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public String  uploadZcproduct(String fileUrl){
        // 1. 把 url 转成本地文件路径
        String localPath = ruoyiConfig.getProfile() + StringUtils.substringAfter(fileUrl, Constants.RESOURCE_PREFIX);
        File file = new File(localPath);
        if (!file.exists()) throw new ServiceException("文件不存在");
        List<Product> list= new ArrayList<>();

        // 2. 用 EasyExcel 读取（内存友好）
        try (InputStream in = new FileInputStream(localPath)) {
            list= EasyExcel.read(in)
                    .head(Product.class)   // 建一个实体类映射列
                    //.registerConverter(new GlobalLongConverter())
                    //.registerConverter(new GlobalDateConverter())
                   // .registerConverter(new GlobalBigDecimalConverter())

                    .sheet()
                    .doReadSync();
            list.removeIf(product -> Objects.equals(product.getRemark(), "跳过")); //将备注等于跳过的行删除
            log.info(">>> 读取完成 size={}", list.size());
        }catch (Exception e){
            log.error(">>> 最外层异常", e);
        }

        if (CollUtil.isEmpty(list)) throw new ServiceException("Excel 无数据");

        String errorTips="";

        // 3. 简单校验 + 批量插入
        for (Product row : list) {
            if(StrUtil.isBlank(row.getProductCode())
                    || StrUtil.isBlank(row.getProductName())
                    || StrUtil.isBlank(row.getMerchantName())
                    || StrUtil.isBlank(row.getMerchantEmail())
            ){
                errorTips+="商品名称："+row.getProductName()+"规格："+row.getSpec()+ ",商品内容不全，请补充完整"+"\n";
            }
            //给创建时间和更新时间赋值
            row.setCreateTime(new Date() );
            row.setUpdateTime(new Date() );
        }
        if(StrUtil.isBlank(errorTips)){
            productMapper.insertBatch(list);   // 自己写个 batchInsert 效率高
            return "成功导入 " + list.size() + " 条";
        }else{
            return errorTips;
        }
    }
}
